package com.mojo.concurrent.concurrent_01_thread;

/**
 * 懒汉式单例模式
 *
 * <p>
 * 同步机制实现线程安全的懒汉式单例模式
 * <p>
 * synchronized原理
 * 10 monitorenter
 * 11 getstatic #2 <com/mojo/concurrent/LazySinglePattern.instance>
 * 14 ifnonnull 27 (+13)
 * 17 new #3 <com/mojo/concurrent/LazySinglePattern>
 * 20 dup
 * 21 invokespecial #4 <com/mojo/concurrent/LazySinglePattern.<init>>
 * 24 putstatic #2 <com/mojo/concurrent/LazySinglePattern.instance>
 * 27 aload_0
 * 28 monitorexit
 * 29 goto 37 (+8)
 * 32 astore_1
 * 33 aload_0
 * 34 monitorexit
 * 如上，是getInstance方法的字节码文件。synchronized在字节码文件中会生成monitorenter和monitorexit指令
 * <p>
 * JDK1.6对synchronized的优化
 * 1.6之前synchronized是一个重量级锁。JDK1.6引入了偏向锁和轻量级锁的概念，synchronized一共有4种锁状态，分别是
 * 无锁状态-->偏向锁状态-->轻量级锁状态-->重量级锁状态，锁的状态随着锁竞争的情况逐步升级，且整个过程是不可逆的（部分过程可逆）。
 * 1、偏向锁：核心是采用CAS客观锁
 * 2、轻量级锁：
 * @author <a href="mailto:mojo_jj@163.com">Mojo</a>
 */
public class LazySinglePattern {
    //2.静态私有属性
    private static volatile LazySinglePattern instance = null;

    // 1.私有构造器
    private LazySinglePattern() {
    }

    // 3、静态方法返回实例
    public static LazySinglePattern getInstance() {
        // 方式一
        //synchronized (LazySinglePattern.class) {
        //    if (instance == null) {
        //        return new LazySinglePattern();
        //    }
        //    return instance;
        //}
        //方式二
        if (instance == null) {
            synchronized (LazySinglePattern.class) {
                if (instance == null) {
                    instance = new LazySinglePattern();
                }
            }
        }
        return instance;
    }

    public void m1() {

    }
}
